package com.cfwx.reflect;

import java.lang.reflect.Method;

/**
 * 
 * 本类测试反射获得类的方法对象，
 * 并通过类对象和类方法对象，运行该方法
 *
 */
public class ReflectMethod{
	
	public static void setValue(Object voObj, String fieldName, Object fieldValue) {
		// 得到相应voObj的类
		Class voClass = voObj.getClass();
		// set方法的前缀模式
		String methodPrefix = "set";
		// 拼接方法名
		String methodName = methodPrefix
				+ fieldName.substring(0, 1).toUpperCase()
				+ fieldName.substring(1);
		// 获得setter方法
		Method method;
		try {//getMethod(String name, Class... parameterTypes) name为方法名，parameterTypes为按声明顺序标识该方法形式参数类型的 Class 对象的一个数组
			method = voClass.getMethod(methodName, new Class[] { fieldValue.getClass() });
			// 利用setter方法把值注射进去
			method.invoke(voObj, new Object[] { fieldValue });//对带有指定参数的指定对象调用由此 Method 对象表示的基础方法。
		} catch (Exception e) {
		   //	logger.error(ExceptionUtil.getStackTraceMessage(e));
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		try {
			//获得窗体类的Class对象
			Class cla=Class.forName("javax.swing.JFrame");
			
			//生成窗体类的实例
			Object obj=cla.newInstance();
			
		    //获得窗体类的setSize方法对象，并指定该方法参数类型为int,int
		    /** public Method getMethod(String name,
                        Class... parameterTypes)
                 throws NoSuchMethodException,SecurityException
			   返回一个 Method 对象，它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String，用于指定所需方法的简称。parameterTypes 
			   参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。如果 parameterTypes 为 null，则按空数组处理
			**/
			Method methodSize=cla.getMethod("setSize", new Class[]{int.class,int.class});
			
			/*
			 * 执行setSize()方法，并传入一个Object[]数组对象， 
			 * 作为该方法参数，等同于  窗体对象.setSize(300,300);
			 */
			methodSize.invoke(obj, new Object[]{new Integer(300),new Integer(300)});
			
		    //获得窗体类的setVisible方法对象，并指定该方法参数类型为boolean
			Method methodVisible=cla.getMethod("setVisible", new Class[]{boolean.class});
			// 执行setVisible()方法，并传入一个Object[]数组对象，   *作为该方法参数。 等同于  窗体对象.setVisible(true);
			methodVisible.invoke(obj, new Object[]{new Boolean(true)});
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

